/*
 * @lc app=leetcode.cn id=36 lang=typescript
 *
 * [36] 有效的数独
 */

// @lc code=start
function isValidSudoku(board: string[][]): boolean {
    for (let i = 0; i < 9; i++) {
        const rArr = board[i].filter((r) => r !== ".");
        if (rArr.length !== new Set(rArr).size) {
            return false;
        }

        let cArr: any[] = [];
        for (let j = 0; j < 9; j++) {
            if (board[j][i] !== ".") cArr.push(board[j][i]);
        }
        if (cArr.length !== new Set(cArr).size) {
            return false
        }
    }

    for (let i = 0; i < 9; i += 3) {
        for (let j = 0; j < 9; j += 3) {
            const arr: any = [];
            arr.push(
                board[i][j],
                board[i][j + 1],
                board[i][j + 2],
                board[i + 1][j],
                board[i + 1][j + 1],
                board[i + 1][j + 2],
                board[i + 2][j],
                board[i + 2][j + 1],
                board[i + 2][j + 2]
            );
            const nArr = arr.filter(r => r !== '.');
            if (nArr.length !== new Set(nArr).size) {
                return false;
            }
        }
    }
    return true;
}

// isValidSudoku([
//     ["8", "3", ".", ".", "7", ".", ".", ".", "."],
//     ["6", ".", ".", "1", "9", "5", ".", ".", "."],
//     [".", "9", "8", ".", ".", ".", ".", "6", "."],
//     ["8", ".", ".", ".", "6", ".", ".", ".", "3"],
//     ["4", ".", ".", "8", ".", "3", ".", ".", "1"],
//     ["7", ".", ".", ".", "2", ".", ".", ".", "6"],
//     [".", "6", ".", ".", ".", ".", "2", "8", "."],
//     [".", ".", ".", "4", "1", "9", ".", ".", "5"],
//     [".", ".", ".", ".", "8", ".", ".", "7", "9"],
// ]);
// @lc code=end
